package com.teacher.dao;

import java.util.Date;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.common.model.Profession;
import com.common.model.Project;
import com.common.model.StudentUser;
import com.common.model.TeacherUser;
import com.common.model.TimePlan;
import com.student.model.IntentProject;
import com.teacher.model.ProjAndProf;
import com.teacher.model.TeachCourse;

/**
 * 教师版块的数据访问对象（DAO） 用于数据持久化
 * 
 * @author XHFSJ
 * 
 */
public interface TeacherDao {

	/**
	 * 用于处理教师修改密码的业务 将修改后的数据持久化
	 * 
	 * @param password
	 *            新密码
	 * @param tea_no
	 *            教师编号
	 * @return 返回值为0/1，若为1，则表示修改成功，反之，则为修改失败
	 */
	public int UpdateTeacherPassword(@Param("pwd") String password,
			@Param("tno") String tea_no);

	/**
	 * 修改教师信息
	 * 
	 * @param name
	 * @param qq
	 * @param tel
	 * @param id
	 * @return
	 */
	public int updateTeacherInfo(TeacherUser teacher);

	/**
	 * 用于向数据库中添加一道题目信息
	 * 
	 * @param p
	 *            一个Project类对象，保存了要添加到数据库中的题目的基本信息
	 */
	public int AddProject(Project p);

	/**
	 * 获取当前教师用户的所有信息
	 * 
	 * @param no
	 * @return
	 */
	public TeacherUser getTeacherInfo(String no);

	/**
	 * 根据专业名称获取专业编号
	 * 
	 * @param name
	 * @return
	 */
	public Integer getIdByProfessionName(String name);

	/**
	 * 查询所有的题目信息
	 * 
	 * @return 返回题目集合
	 */
	public List<Project> exportProject();

	/**
	 * 查询指定老师所在学院的所有专业的编号和名称
	 * 
	 * @return
	 */
	public List<Profession> getAllProfession(Integer tea_id);

	/**
	 * 添加一项题目与可选专业信息
	 * 
	 * @param pap
	 */
	public void AddProjAndProf(ProjAndProf pap);

	/**
	 * 按照题目名称获取题目信息
	 * 
	 * @param name
	 * @return
	 */
	public Project getProjectByName(String name);

	/**
	 * 获取老师发布的所有题目
	 * 
	 * @param tea_id
	 * @return
	 */
	public List<Project> getProjectsOfTeacher(int tea_id);

	/**
	 * 按照题目ID删除题目
	 * 
	 * @param id
	 * @return
	 */
	public int DeleteProjectById(int id);

	/**
	 * 根据题目编号获取题目信息
	 * 
	 * @param id
	 * @return
	 */
	public Project GetProjectById(Integer id);

	/**
	 * 更新题目
	 * 
	 * @param p
	 * @return
	 */
	public int UpdateProject(Project p);

	/**
	 * 根据题目的状态查询新闻
	 * 
	 * @param status
	 * @return
	 */
	public List<Project> GetProjectsByStatus(@Param("status") String status,
			@Param("tea_id") Integer tea_id);

	/**
	 * 根据题目编号查询题目信息
	 * 
	 * @param id
	 * @return
	 */
	public Project getProjectAllInfoById(Integer id);

	/**
	 * 查询该题目的意向列表
	 * 
	 * @param proj_id
	 * @return
	 */
	public List<IntentProject> GetIntentProjectsByProjId(
			@Param("proj_id") Integer proj_id, @Param("maxLevel") long maxLevel);

	/**
	 * 选择某个学生为该题目的拥有者
	 * 
	 * @param stu_id
	 * @param proj_id
	 * @return
	 */
	public int selectStudentOfProject(@Param("stu_id") Integer stu_id,
			@Param("proj_id") Integer proj_id);

	/**
	 * 取消某个题目的已确定学生
	 * 
	 * @param proj_id
	 * @return
	 */
	public int cancelSel(@Param("id") Integer proj_id);

	/**
	 * 获取某位老师的授课信息
	 * 
	 * @param tea_id
	 * @return
	 */
	public List<TeachCourse> GetTeachingCourseByTeacherId(Integer tea_id);

	/**
	 * 获取教师尚未审阅的题目
	 * 
	 * @param tea_id
	 * @return
	 */
	public List<Project> getAuthProject(Integer tea_id);

	/**
	 * 获取教师所在学院的时间信息表
	 * 
	 * @param tea_id
	 * @return
	 */
	public TimePlan getTimePlanByTeacherId(Integer tea_id);

	/**
	 * 按照教职工编号查询教师信息
	 * 
	 * @param no
	 * @return
	 */
	public TeacherUser getTeacherInfoByNo(String no);

	/**
	 * 按照学号查询学生信息
	 * 
	 * @param no
	 * @return
	 */
	public StudentUser getStudentInfoByNo(String no);

	/**
	 * 上传题目任务书
	 * 
	 * @param taskBook
	 * @param proj_id
	 * @return
	 */
	public int uploadTaskBook(@Param("taskBook") String taskBook,
			@Param("id") Integer proj_id);

	/**
	 * 根据教师id以及教师所在部门id获取其他教师信息
	 * 
	 * @param id
	 *            当前教师ID
	 * @param departmentId
	 *            教师所在部门ID
	 * @return
	 */
	public List<TeacherUser> getTeacherListByTeacherId(@Param("id") Integer id,
			@Param("departId") Integer departmentId);

	public int AuthProj(@Param("status") Integer status,
			@Param("reason") String reason, @Param("id") Integer id);

	/**
	 * 给出未选择该学生的理由
	 * 
	 * @param reason
	 * @param id
	 * @return
	 */
	public int setReasonToNotChoose(@Param("reason") String reason,
			@Param("id") Integer id);

	/**
	 * 根据关键词或者题目状态查询题目信息
	 * 
	 * @param status
	 *            题目状态
	 * @param word
	 *            题目检索关键词
	 * @param tea_id
	 *            教师ID
	 * @return
	 */
	public List<Project> GetProjectsByKeywordOrStatus(
			@Param("status") String status, @Param("word") String word,
			@Param("tea_id") Integer tea_id);

	/**
	 * 在当前教师所在部门查找教师名称为name的教师信息
	 * 
	 * @param name
	 *            要查找的教师名字
	 * @param departId
	 *            当前教师所在部门编号
	 * @return
	 */
	public TeacherUser getTeacherInfoByName(@Param("name") String name,
			@Param("departId") Integer departId);

	/**
	 * 获取课程教学计划
	 * 
	 * @param id
	 * @return
	 */
	public String getPlanByCourseId(Integer id);

	/**
	 * 上传课程教学计划书
	 * 
	 * @param planBookName
	 * @param id
	 * @return
	 */
	public int updateTeachingPlanBookByCourseId(
			@Param("plan") String planBookName, @Param("id") Integer id);

	/**
	 * 获取某位老师发布的通过审核的题目
	 * 
	 * @param id
	 * @return
	 */
	public List<Project> getPassedProjectOfTeacher(Integer id);

	/**
	 * 按教师选择学生
	 * 
	 * @param stuId
	 * @param projId
	 * @return
	 */
	public int SelectStuByTeacher(@Param("stu") Integer stuId,
			@Param("id") Integer projId);
	/**
	 * 成绩录入
	 * @param id
	 * @param syScore
	 * @param pyScore
	 * @param db
	 * @return
	 */
	public int setStudentScore(@Param("projId") Integer id,
			@Param("sy") Integer syScore, @Param("py") Integer pyScore,
			@Param("db") Integer db,@Param("dbm") String dbmember,@Param("time") Date date);
	
	/**
	 * 判断是否存在该题目的成绩
	 * @param id
	 * @param syScore
	 * @param pyScore
	 * @param db
	 * @return
	 */
	public Integer existsScore(@Param("id")Integer id);
	
	/**
	 * 修改题目成绩
	 * @param id
	 * @param syScore
	 * @param pyScore
	 * @param db
	 * @return
	 */
	public int updateScore(@Param("id") Integer id,
			@Param("sy") Integer syScore, @Param("py") Integer pyScore,
			@Param("db") Integer db,@Param("time") Date time);
	/**
	 * 最终结果生成
	 * @return
	 */
	public List<Project> generateResult();
}
